package com.diaohw.platform.framework.redis.util;

import cn.hutool.extra.spring.SpringUtil;
import org.springframework.data.redis.core.SetOperations;

import java.util.Set;

import static com.diaohw.platform.framework.redis.util.RedisUtil.expire;
import static com.diaohw.platform.framework.redis.util.RedisUtil.expireTime;

/**
 * @author 刁海文
 * @since 2023/9/19 20:31
 */
public class RedisSetUtil {
    private final static SetOperations set = SpringUtil.getBean(SetOperations.class);


    /**
     * 根据key获取Set中的所有值
     *
     * @param key 键
     */
    public static <T> Set<T> members(String key) {
        return set.members(key);
    }


    /**
     * 元素是否存在
     *
     * @param key   键
     * @param value 值
     * @return true 存在 false不存在
     */
    public static <T> Boolean isMember(String key, T value) {
        return set.isMember(key, value);
    }

    /**
     * 将数据放入set缓存
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return 成功个数
     */
    public static <T> Long addNoExpire(String key, T... values) {
        return set.add(key, values);
    }


    /**
     * 将数据放入set缓存
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return 成功个数
     */
    public static <T> Long add(String key, T... values) {
        return add(key, expireTime, values);
    }


    /**
     * 将set数据放入缓存
     *
     * @param key    键
     * @param time   时间(秒)
     * @param values 值 可以是多个
     * @return 成功个数
     */
    public static <T> Long add(String key, long time, T... values) {
        Long count = set.add(key, values);
        expire(key, time);
        return count;
    }


    /**
     * 获取set缓存的长度
     *
     * @param key 键
     */
    public static Long size(String key) {
        return set.size(key);
    }


    /**
     * 移除值为value的
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return 移除的个数
     */

    public static <T> Long remove(String key, T... values) {
        return set.remove(key, values);
    }

    /**
     * 随机返回一个元素
     *
     * @param key 键
     */
    public static <T> T randomMember(String key) {
        return (T) set.randomMember(key);
    }

    /**
     * 随机返回指定数量的元素
     *
     * @param key   键
     * @param count 元素数量
     */
    public static <T> Set<T> randomMembers(String key, long count) {
        return (Set<T>) set.randomMembers(key, count);
    }

    /**
     * 随机返回一个元素并移除
     *
     * @param key 键
     */
    public static <T> T pop(String key) {
        return (T) set.pop(key);
    }

    /**
     * 随机返回指定数量的元素并移除
     *
     * @param key   键
     * @param count 元素数量
     */
    public static <T> Set<T> pop(String key, long count) {
        return (Set<T>) set.pop(key, count);
    }

    /**
     * 合并多个key并返回结果
     */
    public static <T> Set<T> union(Set<T> set1, Set<T> set2) {
        return set.union(set1, set2);
    }

    /**
     * 合并两个key并返回
     */
    public static <T> Set<T> union(String key, String targetKey) {
        return set.union(key, targetKey);
    }

}
